﻿using Microsoft.Win32;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Management;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

namespace YbPrintPlug
{
    /// <summary>
    /// 获取显示器物理尺寸的工具类（支持多屏、优先使用硬件API）
    /// </summary>
        public class SystemInfo
        {

            public virtual List<string> GetMonitorPnpDeviceId()
            {
                List<string> rt = new List<string>();

                using (ManagementClass mc = new ManagementClass("Win32_DesktopMonitor"))
                {
                    using (ManagementObjectCollection moc = mc.GetInstances())
                    {
                        foreach (var o in moc)
                        {
                            var each = (ManagementObject)o;
                            object obj = each.Properties["PNPDeviceID"].Value;
                            if (obj == null)
                        {
                            rt.Add("老旧设备，无法获得信息");
                            continue;
                        }
                                

                            rt.Add(each.Properties["PNPDeviceID"].Value.ToString());
                        }
                    }
                }

                return rt;
            }

            public virtual byte[] GetMonitorEdid(string monitorPnpDevId)
            {
                return (byte[])Registry.GetValue(@"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\" + monitorPnpDevId + @"\Device Parameters", "EDID", new byte[] { });
            }

            //获取显示器物理尺寸(cm)
            public virtual SizeF GetMonitorPhysicalSize(string monitorPnpDevId)
            {
                byte[] edid = GetMonitorEdid(monitorPnpDevId);
                if (edid==null || edid.Length < 23)
                    return SizeF.Empty;

                return new SizeF(edid[21], edid[22]);
            }

            //通过屏显示器理尺寸转换为显示器大小(inch)
            public static float MonitorScaler(SizeF moniPhySize)
            {
                double mDSize = Math.Sqrt(Math.Pow(moniPhySize.Width, 2) + Math.Pow(moniPhySize.Height, 2)) / 2.54d;
                return (float)Math.Round(mDSize, 1);
            }
        }
    }